package com.university.mentalhealthplatform.global.log.manager;

import com.university.mentalhealthplatform.global.log.dto.ManagerLogDTO;
import com.university.mentalhealthplatform.utils.PagedResponse;
import com.university.mentalhealthplatform.utils.stringUtils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.university.mentalhealthplatform.global.log.enums.LogStatus;
import com.university.mentalhealthplatform.global.log.enums.OperationStatus;

import java.time.LocalDateTime;

@Service
public class ManagerLogService {

    @Autowired
    private ManagerLogRepository managerLogRepository;

    /**
     * 分页查询操作日志
     *
     * @param systemModule    模块名称（可选）
     * @param operatorName    操作人员名称（可选）
     * @param logStatus       日志状态（可选）
     * @param operationStatus 操作状态（可选）
     * @param startDate       开始时间（可选）
     * @param endDate         结束时间（可选）
     * @param page            当前页码
     * @param size        每页大小
     * @return 查询结果
     */
    public PagedResponse<ManagerLogDTO> getManagerLogs(String systemModule, String operatorName, String logStatus,
                                                       String operationStatus, LocalDateTime startDate, LocalDateTime endDate,
                                                       int page, int size,
                                                       String sortField, String sortOrder) {

        // 默认排序：如果没有传入排序字段，则使用 operationTime 降序
        Sort sort = Sort.by(Sort.Order.desc("operationTime"));

        // 如果传入了排序字段和排序顺序
        if (sortField != null && !sortField.isEmpty()) {
            // 根据传入的排序顺序（ASC 或 DESC）构建排序对象
            Sort.Order order = "ASC".equalsIgnoreCase(sortOrder)
                    ? Sort.Order.asc(sortField)
                    : Sort.Order.desc(sortField);

            sort = Sort.by(order);
        }

        // 创建分页请求对象
        Pageable pageable = PageRequest.of(page, size, sort);

        // 确保 logStatus 和 operationStatus 是枚举类型
        LogStatus logStatusEnum = (logStatus != null && !logStatus.trim().isEmpty()) ? LogStatus.valueOf(logStatus) : null;
        OperationStatus operationStatusEnum = (operationStatus != null && !operationStatus.trim().isEmpty()) ?
                OperationStatus.valueOf(operationStatus) : null;

        // 调用 Repository 方法查询数据
        Page<ManagerLogDTO> pageResult = managerLogRepository.findManagerLogsWithFilters(
                systemModule,
                operatorName,
                logStatusEnum,
                operationStatusEnum,
                startDate,
                endDate,
                pageable
        );

        // 使用 PagedResponse 包装分页结果并返回
        return new PagedResponse<>(pageResult);
    }


    @Transactional
    public void deleteLoginLogsByIds(Long[] ids) {
        managerLogRepository.deleteByIdIn(ids);
    }

    @Transactional
    public void clearAllLoginLogs() {
        managerLogRepository.deleteAll();
    }
}
